/** 
* 函数说明 
* @关键字 
*/

export const pddm=(point, polygon)=> {
    var N = polygon.length;
    var boundOrVertex = true; //如果点位于多边形的顶点或边上，也算做点在多边形内，直接返回true
    var intersectCount = 0; //cross points count of x
    var precision = 2e-10; //浮点类型计算时候与0比较时候的容差
    var p1, p2; //neighbour bound vertices
    var p = point; //测试点
    // var p = point[0]; //测试点

    p1 = polygon[0]; //left vertex
    for (var i = 1; i <= N; ++i) {
        //check all rays
        if (p.lat == p1.lat && p.lng == p1.lng) {
            return boundOrVertex; //p is an vertex
        }

        p2 = polygon[i % N]; //right vertex
        if (p.lng < Math.min(p1.lng, p2.lng) || p.lng > Math.max(p1.lng, p2.lng)) {
            //ray is outside of our interests
            p1 = p2;
            continue; //next ray left point
        }
        if (p.lng > Math.min(p1.lng, p2.lng) && p.lng < Math.max(p1.lng, p2.lng)) {
            //ray is crossing over by the algorithm (common part of)
            if (p.lat <= Math.max(p1.lat, p2.lat)) {
                //x is before of ray
                if (p1.lng == p2.lng && p.lat >= Math.min(p1.lat, p2.lat)) {
                    //overlies on a horizontal ray
                    return boundOrVertex;
                }
                if (p1.lat == p2.lat) {
                    //ray is vertical
                    if (p1.lat == p.lat) {
                        //overlies on a vertical ray
                        return boundOrVertex;
                    } else {
                        //before ray
                        ++intersectCount;
                    }
                } else {
                    //cross point on the left side
                    var xinters = ((p.lng - p1.lng) * (p2.lat - p1.lat)) / (p2.lng - p1.lng) + p1.lat; //cross point of x
                    if (Math.abs(p.lat - xinters) < precision) {
                        //overlies on a ray
                        return boundOrVertex;
                    }
                    if (p.lat < xinters) {
                        //before ray
                        ++intersectCount;
                    }
                }
            }
        } else {
            //special case when ray is crossing through the vertex
            if (p.lng == p2.lng && p.lat <= p2.lat) {
                //p crossing over p2
                var p3 = polygon[(i + 1) % N]; //next vertex
                if (p.lng >= Math.min(p1.lng, p3.lng) && p.lng <= Math.max(p1.lng, p3.lng)) {
                    //p.y lies between p1.y & p3.y
                    ++intersectCount;
                } else {
                    intersectCount += 2;
                }
            }
        }
        p1 = p2;
    }
    if (intersectCount % 2 == 0) {
        //偶数在多边形外
        return false;
        // this.flag = false
    } else {
        //奇数在多边形内
        return true;
        // this.flag = true
    }
}